package cn.aws360.boot.system.starter.controller;

import cn.aws360.boot.auth.api.constant.AuthConstant;
import cn.aws360.boot.auth.api.helper.LoginHelper;
import cn.aws360.boot.base.api.constant.enums.DelFlagEnum;
import cn.aws360.boot.base.api.constant.enums.OpsTypeEnum;
import cn.aws360.boot.base.api.constant.enums.ResTypeEnum;
import cn.aws360.boot.base.api.constant.enums.SysFlagEnum;
import cn.aws360.boot.base.api.pojo.response.ResultModel;
import cn.aws360.boot.data.api.constant.enums.DataScopeEnum;
import cn.aws360.boot.system.api.constant.SysConstant;
import cn.aws360.boot.system.api.constant.enums.BucketEnum;
import cn.aws360.boot.system.api.constant.enums.MenuTypeEnum;
import cn.aws360.boot.system.api.pojo.response.SysFileModel;
import cn.aws360.boot.system.biz.domain.*;
import cn.aws360.boot.system.biz.service.*;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.FileUtil;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author junnan
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/sys")
@ApiSupport(order = 10)
@Api(value = "INIT", tags = "10-初始化数据")
public class XyzInitController {

    private final SysConfService confService;
    private final SysDictService dictService;
    private final SysDictItemService dictItemService;
    private final SysFileService sysFileService;
    private final SysDeptService deptService;
    private final SysRoleService roleService;
    private final SysUserService userService;
    private final SysUserRoleService userRoleService;
    private final SysMenuService menuService;
    private final SysRoleMenuService roleMenuService;

    @GetMapping("/init")
    @SaCheckRole("ROLE_ADMIN")
    @ApiOperation(value = "初始化表")
    @ApiOperationSupport(order = 4)
    public ResultModel<Boolean> init() {
        initSysConf();
        initSysDict();
        initSysFile();
        initSysDept();
        initSysRole();
        initSysUser();
        initSysUserRole();
        initSysMenu();
        initSysRoleMenu();
        return ResultModel.ok(true);
    }

    private void initSysConf() {
        List<SysConf> confList = Arrays.asList(
                SysConf.builder().id(1001).name("初始化密码").code(AuthConstant.CONF_INIT_PASS)
                        .value(AuthConstant.CONF_INIT_PASS_DEFAULT).sysFlag(1).build(),
                SysConf.builder().id(1002).name("验证码开关").code(AuthConstant.CONF_CAPTCHA_SWITCH)
                        .value(AuthConstant.CONF_CAPTCHA_SWITCH_DEFAULT).sysFlag(1).build()
        );
        confService.saveBatch(confList);
    }

    private void initSysDict() {
        List<SysDict> dictList = new ArrayList<>();
        List<SysDictItem> dictItemList = new ArrayList<>();

        int sysFlagId = 1100;
        dictList.add(SysDict.builder().id(sysFlagId).name("是否系统").code("SYS_FLAG").sysFlag(1).build());
        dictItemList.addAll(Arrays.stream(SysFlagEnum.values()).map(x ->
                SysDictItem.builder().id(sysFlagId + x.getValue()).pid(sysFlagId).label(x.getLabel())
                        .value(x.getValue()).sort(x.getValue()).build()).collect(Collectors.toList()));

        int delFlagId = 1200;
        dictList.add(SysDict.builder().id(delFlagId).name("是否删除").code("SYS_DEL_FLAG").sysFlag(1).build());
        dictItemList.addAll(Arrays.stream(DelFlagEnum.values()).map(x ->
                SysDictItem.builder().id(delFlagId + x.getValue()).pid(delFlagId).label(x.getLabel())
                        .value(x.getValue()).sort(x.getValue()).build()).collect(Collectors.toList()));

        int opsTypeId = 1300;
        dictList.add(SysDict.builder().id(opsTypeId).name("操作类型").code("SYS_OPS_TYPE").sysFlag(1).build());
        dictItemList.addAll(Arrays.stream(OpsTypeEnum.values()).map(x ->
                SysDictItem.builder().id(opsTypeId + x.getValue()).pid(opsTypeId).label(x.getLabel())
                        .value(x.getValue()).sort(x.getValue()).build()).collect(Collectors.toList()));

        int resTypeId = 1400;
        dictList.add(SysDict.builder().id(resTypeId).name("响应类型").code("SYS_RES_TYPE").sysFlag(1).build());
        dictItemList.addAll(Arrays.stream(ResTypeEnum.values()).map(x ->
                SysDictItem.builder().id(resTypeId + x.getValue()).pid(resTypeId).label(x.getLabel())
                        .value(x.getValue()).sort(x.getValue()).build()).collect(Collectors.toList()));

        int scopeTypeId = 2100;
        dictList.add(SysDict.builder().id(scopeTypeId).name("数据权限类型").code("SYS_SCOPE_TYPE").sysFlag(1).build());
        dictItemList.addAll(Arrays.stream(DataScopeEnum.values()).map(x ->
                SysDictItem.builder().id(scopeTypeId + x.getValue()).pid(scopeTypeId).label(x.getLabel())
                        .value(x.getValue()).sort(x.getValue()).build()).collect(Collectors.toList()));

        int menuTypeId = 3100;
        dictList.add(SysDict.builder().id(menuTypeId).name("菜单类型").code("SYS_MENU_TYPE").sysFlag(1).build());
        dictItemList.addAll(Arrays.stream(MenuTypeEnum.values()).map(x ->
                SysDictItem.builder().id(menuTypeId + x.getValue()).pid(menuTypeId).label(x.getLabel())
                        .value(x.getValue()).sort(x.getValue()).build()).collect(Collectors.toList()));

        dictService.saveBatch(dictList);
        dictItemService.saveBatch(dictItemList);
    }

    private void initSysFile() {
        String filePath = "file" + File.separator + "users.xlsx";
        File file = FileUtil.file(this.getClass().getClassLoader().getResource(filePath));
        SysFileModel sysFileModel = sysFileService.upload(BucketEnum.PUBLIC.getName(), SysConstant.OSS_DIRECTORY_SYSTEM, file);
        SysFile sysFile = BeanUtil.copyProperties(sysFileModel, SysFile.class);
        sysFile.setId(1100);

        List<SysFile> sysFileList = Collections.singletonList(sysFile);
        sysFileService.saveBatch(sysFileList);
    }

    private void initSysDept() {
        List<SysDept> deptList = Arrays.asList(
                SysDept.builder().id(1).pid(0).name("汉末总集团").sort(0).ancestors("0").build(),

                SysDept.builder().id(100).pid(1).name("曹魏集团").sort(1).ancestors("0,1").build(),
                SysDept.builder().id(200).pid(1).name("刘蜀集团").sort(2).ancestors("0,1").build(),
                SysDept.builder().id(300).pid(1).name("孙吴集团").sort(3).ancestors("0,1").build(),

                SysDept.builder().id(101).pid(100).name("军机部").sort(1).ancestors("0,1,100").build(),
                SysDept.builder().id(102).pid(100).name("兵马部").sort(2).ancestors("0,1,100").build(),
                SysDept.builder().id(103).pid(100).name("后勤部").sort(3).ancestors("0,1,100").build(),

                SysDept.builder().id(201).pid(200).name("军机部").sort(1).ancestors("0,1,200").build(),
                SysDept.builder().id(202).pid(200).name("兵马部").sort(2).ancestors("0,1,200").build(),

                SysDept.builder().id(301).pid(300).name("军机部").sort(1).ancestors("0,1,300").build()
        );
        deptService.saveBatch(deptList);
    }

    private void initSysRole() {
        List<SysRole> roleList = Arrays.asList(
                SysRole.builder().id(1).name("管理员").code("ROLE_ADMIN").dataScope(1).build(),
                SysRole.builder().id(2).name("集团经理").code("ROLE_MANAGER").dataScope(2).build(),
                SysRole.builder().id(3).name("部门组长").code("ROLE_MINISTER").dataScope(4).build(),
                SysRole.builder().id(4).name("普通员工").code("ROLE_EMPLOYEE").dataScope(3).build()
        );
        roleService.saveBatch(roleList);
    }

    private void initSysUser() {
        String password = LoginHelper.encryptPassword("123456");

        List<SysUser> userList = Arrays.asList(
                SysUser.builder().id(1).deptId(1).username("admin").password(password).nickname("天老大")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/110/110.jpg")
                        .email("admin@d001.com").mobile("18012340001").build(),

                SysUser.builder().id(101).deptId(100).username("cc").password(password).nickname("曹孟德")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/128/128.jpg")
                        .email("cc@d100.com").mobile("18012340101").build(),

                SysUser.builder().id(201).deptId(200).username("lb").password(password).nickname("刘玄德")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/170/170.jpg")
                        .email("lb@d200.com").mobile("18012340201").build(),

                SysUser.builder().id(301).deptId(300).username("sc").password(password).nickname("孙伯符")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/510/510.jpg")
                        .email("sc@d300.com").mobile("18012340301").build(),

                SysUser.builder().id(1011).deptId(101).username("sm").password(password).nickname("司马懿")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/137/137.jpg")
                        .email("sm@d101.com").mobile("18012341011").build(),

                SysUser.builder().id(1021).deptId(102).username("dw").password(password).nickname("典恶来")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/129/129.jpg")
                        .email("dw@d102.com").mobile("18012341021").build(),

                SysUser.builder().id(1031).deptId(103).username("xh").password(password).nickname("夏侯敦")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/126/126.jpg")
                        .email("xh@d103.com").mobile("18012341031").build(),

                SysUser.builder().id(2011).deptId(201).username("zg").password(password).nickname("诸葛亮")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/190/190.jpg")
                        .email("zg@d201.com").mobile("18012342011").build(),

                SysUser.builder().id(2021).deptId(202).username("gy").password(password).nickname("关云长")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/140/140.jpg")
                        .email("dw@d202.com").mobile("18012342021").build(),

                SysUser.builder().id(3011).deptId(301).username("zy").password(password).nickname("周公瑾")
                        .avatar("https://game.gtimg.cn/images/yxzj/img201606/heroimg/124/124.jpg")
                        .email("zy@d301.com").mobile("18012343011").build()
        );
        userService.saveBatch(userList);
    }

    private void initSysUserRole() {
        List<SysUserRole> userRoleList = Arrays.asList(
                SysUserRole.builder().userId(1).roleId(1).build(),
                SysUserRole.builder().userId(101).roleId(2).build(),
                SysUserRole.builder().userId(201).roleId(2).build(),
                SysUserRole.builder().userId(301).roleId(2).build(),
                SysUserRole.builder().userId(1011).roleId(3).build(),
                SysUserRole.builder().userId(1021).roleId(3).build(),
                SysUserRole.builder().userId(1031).roleId(4).build(),
                SysUserRole.builder().userId(2011).roleId(3).build(),
                SysUserRole.builder().userId(2021).roleId(3).build(),
                SysUserRole.builder().userId(3011).roleId(3).build()
        );
        userRoleService.saveBatch(userRoleList);
    }

    private void initSysMenu() {
        List<SysMenu> menuList = Arrays.asList(
                SysMenu.builder().id(100).pid(0).name("接口文档").type(MenuTypeEnum.LINK.getValue()).sort(1)
                        .icon("iconfont icon-doc").path("http://localhost:8001/doc.html").build(),

                SysMenu.builder().id(1000).pid(0).name("系统管理").type(MenuTypeEnum.LIST.getValue()).sort(2)
                        .icon("iconfont icon-sys").build(),

                SysMenu.builder().id(1100).pid(1000).name("用户管理").type(MenuTypeEnum.LIST.getValue()).sort(1)
                        .icon("iconfont icon-sys-user").path("/sys/user/").component("sys/user/index.json").build(),
                SysMenu.builder().id(1200).pid(1000).name("角色管理").type(MenuTypeEnum.LIST.getValue()).sort(2)
                        .icon("iconfont icon-sys-role").path("/sys/role/").component("sys/role/index.json").build(),
                SysMenu.builder().id(1300).pid(1000).name("菜单管理").type(MenuTypeEnum.LIST.getValue()).sort(3)
                        .icon("iconfont icon-sys-menu").path("/sys/menu/").component("sys/menu/index.json").build(),
                SysMenu.builder().id(1400).pid(1000).name("部门管理").type(MenuTypeEnum.LIST.getValue()).sort(4)
                        .icon("iconfont icon-sys-dept").path("/sys/dept/").component("sys/dept/index.json").build(),

                SysMenu.builder().id(1600).pid(1000).name("参配管理").type(MenuTypeEnum.LIST.getValue()).sort(6)
                        .icon("iconfont icon-sys-conf").path("/sys/conf/").component("sys/conf/index.json").build(),
                SysMenu.builder().id(1700).pid(1000).name("字典管理").type(MenuTypeEnum.LIST.getValue()).sort(7)
                        .icon("iconfont icon-sys-dict").path("/sys/dict/").component("sys/dict/index.json").build(),
                SysMenu.builder().id(1800).pid(1000).name("文件管理").type(MenuTypeEnum.LIST.getValue()).sort(8)
                        .icon("iconfont icon-sys-file").path("/sys/file/").component("sys/file/index.json").build(),
                SysMenu.builder().id(1900).pid(1000).name("日志管理").type(MenuTypeEnum.LIST.getValue()).sort(9)
                        .icon("iconfont icon-sys-logs").path("/sys/logs/").component("sys/logs/index.json").build(),

                SysMenu.builder().id(1101).pid(1100).name("用户查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:user:query").build(),
                SysMenu.builder().id(1102).pid(1100).name("用户新增").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:user:add").build(),
                SysMenu.builder().id(1103).pid(1100).name("用户修改").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:user:edit").build(),
                SysMenu.builder().id(1104).pid(1100).name("用户删除").type(MenuTypeEnum.BUTTON.getValue()).sort(4).perm("sys:user:remove").build(),

                SysMenu.builder().id(1201).pid(1200).name("角色查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:role:query").build(),
                SysMenu.builder().id(1202).pid(1200).name("角色新增").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:role:add").build(),
                SysMenu.builder().id(1203).pid(1200).name("角色修改").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:role:edit").build(),
                SysMenu.builder().id(1204).pid(1200).name("角色删除").type(MenuTypeEnum.BUTTON.getValue()).sort(4).perm("sys:role:remove").build(),

                SysMenu.builder().id(1301).pid(1300).name("菜单查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:menu:query").build(),
                SysMenu.builder().id(1302).pid(1300).name("菜单新增").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:menu:add").build(),
                SysMenu.builder().id(1303).pid(1300).name("菜单修改").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:menu:edit").build(),
                SysMenu.builder().id(1304).pid(1300).name("菜单删除").type(MenuTypeEnum.BUTTON.getValue()).sort(4).perm("sys:menu:remove").build(),

                SysMenu.builder().id(1401).pid(1400).name("部门查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:dept:query").build(),
                SysMenu.builder().id(1402).pid(1400).name("部门新增").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:dept:add").build(),
                SysMenu.builder().id(1403).pid(1400).name("部门修改").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:dept:edit").build(),
                SysMenu.builder().id(1404).pid(1400).name("部门删除").type(MenuTypeEnum.BUTTON.getValue()).sort(4).perm("sys:dept:remove").build(),

                SysMenu.builder().id(1601).pid(1600).name("参配查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:conf:query").build(),
                SysMenu.builder().id(1602).pid(1600).name("参配新增").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:conf:add").build(),
                SysMenu.builder().id(1603).pid(1600).name("参配修改").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:conf:edit").build(),
                SysMenu.builder().id(1604).pid(1600).name("参配删除").type(MenuTypeEnum.BUTTON.getValue()).sort(4).perm("sys:conf:remove").build(),

                SysMenu.builder().id(1701).pid(1700).name("字典查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:dict:query").build(),
                SysMenu.builder().id(1702).pid(1700).name("字典新增").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:dict:add").build(),
                SysMenu.builder().id(1703).pid(1700).name("字典修改").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:dict:edit").build(),
                SysMenu.builder().id(1704).pid(1700).name("字典删除").type(MenuTypeEnum.BUTTON.getValue()).sort(4).perm("sys:dict:remove").build(),

                SysMenu.builder().id(1801).pid(1800).name("文件查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:file:query").build(),
                SysMenu.builder().id(1802).pid(1800).name("文件新增").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:file:add").build(),
                SysMenu.builder().id(1803).pid(1800).name("文件修改").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:file:edit").build(),
                SysMenu.builder().id(1804).pid(1800).name("文件删除").type(MenuTypeEnum.BUTTON.getValue()).sort(4).perm("sys:file:remove").build(),

                SysMenu.builder().id(1901).pid(1900).name("日志查询").type(MenuTypeEnum.BUTTON.getValue()).sort(1).perm("sys:logs:query").build(),
                SysMenu.builder().id(1902).pid(1900).name("日志删除").type(MenuTypeEnum.BUTTON.getValue()).sort(2).perm("sys:logs:remove").build(),
                SysMenu.builder().id(1903).pid(1900).name("日志清除").type(MenuTypeEnum.BUTTON.getValue()).sort(3).perm("sys:logs:delete").build()
        );
        menuService.saveBatch(menuList);
    }

    private void initSysRoleMenu() {
        List<SysRoleMenu> roleMenuList = Arrays.asList(
                SysRoleMenu.builder().roleId(1).menuId(100).build(),
                SysRoleMenu.builder().roleId(1).menuId(1000).build(),

                SysRoleMenu.builder().roleId(1).menuId(1100).build(),
                SysRoleMenu.builder().roleId(1).menuId(1101).build(),
                SysRoleMenu.builder().roleId(1).menuId(1102).build(),
                SysRoleMenu.builder().roleId(1).menuId(1103).build(),
                SysRoleMenu.builder().roleId(1).menuId(1104).build(),

                SysRoleMenu.builder().roleId(1).menuId(1200).build(),
                SysRoleMenu.builder().roleId(1).menuId(1201).build(),
                SysRoleMenu.builder().roleId(1).menuId(1202).build(),
                SysRoleMenu.builder().roleId(1).menuId(1203).build(),
                SysRoleMenu.builder().roleId(1).menuId(1204).build(),

                SysRoleMenu.builder().roleId(1).menuId(1300).build(),
                SysRoleMenu.builder().roleId(1).menuId(1301).build(),
                SysRoleMenu.builder().roleId(1).menuId(1302).build(),
                SysRoleMenu.builder().roleId(1).menuId(1303).build(),
                SysRoleMenu.builder().roleId(1).menuId(1304).build(),

                SysRoleMenu.builder().roleId(1).menuId(1400).build(),
                SysRoleMenu.builder().roleId(1).menuId(1401).build(),
                SysRoleMenu.builder().roleId(1).menuId(1402).build(),
                SysRoleMenu.builder().roleId(1).menuId(1403).build(),
                SysRoleMenu.builder().roleId(1).menuId(1404).build(),

                SysRoleMenu.builder().roleId(1).menuId(1600).build(),
                SysRoleMenu.builder().roleId(1).menuId(1601).build(),
                SysRoleMenu.builder().roleId(1).menuId(1602).build(),
                SysRoleMenu.builder().roleId(1).menuId(1603).build(),
                SysRoleMenu.builder().roleId(1).menuId(1604).build(),

                SysRoleMenu.builder().roleId(1).menuId(1700).build(),
                SysRoleMenu.builder().roleId(1).menuId(1701).build(),
                SysRoleMenu.builder().roleId(1).menuId(1702).build(),
                SysRoleMenu.builder().roleId(1).menuId(1703).build(),
                SysRoleMenu.builder().roleId(1).menuId(1704).build(),

                SysRoleMenu.builder().roleId(1).menuId(1800).build(),
                SysRoleMenu.builder().roleId(1).menuId(1801).build(),
                SysRoleMenu.builder().roleId(1).menuId(1802).build(),
                SysRoleMenu.builder().roleId(1).menuId(1803).build(),
                SysRoleMenu.builder().roleId(1).menuId(1804).build(),

                SysRoleMenu.builder().roleId(1).menuId(1900).build(),
                SysRoleMenu.builder().roleId(1).menuId(1901).build(),
                SysRoleMenu.builder().roleId(1).menuId(1902).build(),
                SysRoleMenu.builder().roleId(1).menuId(1903).build(),

                SysRoleMenu.builder().roleId(2).menuId(1000).build(),

                SysRoleMenu.builder().roleId(2).menuId(1100).build(),
                SysRoleMenu.builder().roleId(2).menuId(1101).build(),
                SysRoleMenu.builder().roleId(2).menuId(1102).build(),
                SysRoleMenu.builder().roleId(2).menuId(1103).build(),
                SysRoleMenu.builder().roleId(2).menuId(1104).build(),

                SysRoleMenu.builder().roleId(3).menuId(1000).build(),

                SysRoleMenu.builder().roleId(3).menuId(1100).build(),
                SysRoleMenu.builder().roleId(3).menuId(1101).build()
        );
        roleMenuService.saveBatch(roleMenuList);
    }

}
